#include <iostream>
using namespace std;
class A
{
public:
    A(int a=0)
        :_a(a)//初始化列表
    {
        cout<< " A() " <<endl;
    }
    ~A()
    {
        cout<< "~A()" <<endl;
    }
private:
    int _a;
};

int test1()//动态空间 new
{
    int* p1=new int;    //申请一个int不会初始化
    int* p2=new int(20);//一个int初始化为20
    int* p3=new int[10];//申请10个int的数组
    int* p4=new int[10]{1,2,3};//数组初始化
    delete p1;//free p1
    delete p2;//
    delete[] p3;//free数组p3 p4
    delete[] p4;

    //new/delete和malloc/free的区别就是new/delete会调用构造和析构函数
    A* a1=new A();  //调用构造函数
    delete a1;      //先调用析构函数 再释放空间

    A* a2=new A[3]; //调用3次构造函数
    delete[] a2;    //先调用析构函数 再释放空间

    A* a3=(A*)malloc(sizeof(A));
    if(a3== nullptr) perror("malloc fail");
    new(a3)A(20);//定位new 初始化已有空间
    a3->~A();
    free(a3);

    return 0;
}



//——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————



//template<class T>
template<typename T>
void Swap(T& x,T& y)
{
    T tmp=x;
    x=y;
    y=tmp;
}

template<typename A>
A ADD(const A& x,const A&y)
{
    return x+y;
}
int test2()//泛型编程--模版
{
    //模版是让编译器去产生特定类型函数的模具
    int a=10,b=20;
    Swap(a,b);//看似是用同一个函数，汇编中用的不是一个
    double c=30,d=40;
    Swap(c,d);

    cout << ADD(a,b) << endl;
    cout << ADD(c,d) << endl;
    //显示实例化
    cout << ADD<int>(a,c) << endl;
    cout << ADD<double>(d,b) << endl;

    return 0;
}



//——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————


template<class S>
class Stack
{
public:
    Stack(int capacity=4)
    {
        _a=new S[capacity];
        _top=_capacity=0;
        cout<< "Stack()" << endl;
    }
    ~Stack()
    {
        delete[] _a;
        _capacity=_top=0;
        cout<< "~Stack()" << endl;
    }
private:
    S* _a;
    size_t _top;
    size_t _capacity;
};
int test3()//显示实例化--不同类型栈
{
    Stack<int> st1;
    Stack<double> st2;
    return 0;
}

int main() {
    test1();
//    test2();
//    test3();
    return 0;
}
